#ifndef _DHT11_H_
#define _DHT11_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>

/* 返回值 */
#define OK 0
#define EINVAL -1
#define ECHECKSUM -2
#define ETIMEOUT -3

/* 枚举 */
#define INPUT 0
#define OUTPUT 1

#define LOW 0
#define HIGH 1

/**
 * @brief 单总线操作接口
 */
struct one_wire_ops {
        int (*read)(); // [必选] 读取GPIO输入电平
        void (*write)(int val); // [必选] GPIO输出高低电平
        void (*dir_set)(int dir); // [可选] 设置GPIO输入输出方向
                                  //        51单片机IO支持双向, 则无需实现
};

/**
 * @brief 时间操作接口
 */
struct time_ops {
        void (*delay_us)(int us); // [必选] 微秒延时
        void (*delay_ms)(int ms); // [必选] 毫秒延时
        uint64_t (*get)(); // [必选] 获取当前时间, 单位us
};

/**
 * @brief dht11 传感器
 */
struct dht11 {
        struct one_wire_ops wire; // 单总线操作接口
        struct time_ops time; // 时间操作接口
};

/**
 * @brief 读取 dht11 温湿度
 * @return int
 *         OK 成功
 *         EINVAL 无效的参数
 *         ECHECKSUM 数据校验失败
 *         ETIMEOUT 读取超时
 */
int dht11_read(struct dht11* sensor, uint8_t* temp, uint8_t* hum);

#ifdef __cplusplus
}
#endif

#endif
